package cn.swenty.backstage.framework.util;
import java.util.List;
import java.util.Map;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import cn.swenty.backstage.framework.common.util.StringUtil;
/**
 * 导出Excel文档工具类
 * @date 2014-8-6
 * */
public class ExcelUtil {
	

    /**
     * 创建excel文档，
     * @param list 数据
     * @param keys list中map的key数组集合
     * @param columnNames excel的列名
     * */
    public Workbook createWorkBook(List<? extends Map<String, Object>> listMap,List<?> list ,String col_key,String title_key , String template_key) {
            // 创建excel工作簿
            Workbook wb = new XSSFWorkbook();
            // 创建第一个sheet（页），并命名
            Sheet sheet = wb.createSheet("数据");
            // 手动设置列宽。第一个参数表示要为第几列设；，第二个参数表示列的宽度，n为列高的像素数。
           /* for(int i=0;i<keys.length;i++){
                sheet.setColumnWidth((short) i, (short) (35.7 * 150));
            }*/

            // 创建第一行
            Row row = sheet.createRow((short) 0);

            // 创建两种单元格格式
            CellStyle cs = wb.createCellStyle();
            CellStyle cs2 = wb.createCellStyle();

            // 创建两种字体
            Font f = wb.createFont();
            Font f2 = wb.createFont();

            // 创建第一种字体样式（用于列名）
            f.setFontHeightInPoints((short) 10);
            f.setColor(IndexedColors.BLACK.getIndex());
            f.setBoldweight(Font.BOLDWEIGHT_BOLD);

            // 创建第二种字体样式（用于值）
            f2.setFontHeightInPoints((short) 10);
            f2.setColor(IndexedColors.BLACK.getIndex());

//            Font f3=wb.createFont();
//            f3.setFontHeightInPoints((short) 10);
//            f3.setColor(IndexedColors.RED.getIndex());

            // 设置第一种单元格的样式（用于列名）
            cs.setFont(f);
            cs.setBorderLeft(CellStyle.BORDER_THIN);
            cs.setBorderRight(CellStyle.BORDER_THIN);
            cs.setBorderTop(CellStyle.BORDER_THIN);
            cs.setBorderBottom(CellStyle.BORDER_THIN);
            cs.setAlignment(CellStyle.ALIGN_CENTER);

            // 设置第二种单元格的样式（用于值）
            cs2.setFont(f2);
            cs2.setBorderLeft(CellStyle.BORDER_THIN);
            cs2.setBorderRight(CellStyle.BORDER_THIN);
            cs2.setBorderTop(CellStyle.BORDER_THIN);
            cs2.setBorderBottom(CellStyle.BORDER_THIN);
            cs2.setAlignment(CellStyle.ALIGN_CENTER);
          
            int index = 0;
            //设置列名
            for(int i=0;i<listMap.size();i++){
            	 if(StringUtil.isNull(listMap.get(i).get(title_key))){
            		 continue;
            	 }
                Cell cell = row.createCell(index);
                cell.setCellValue(listMap.get(i).get(title_key)+"");
                cell.setCellStyle(cs);
                index++;
            }
            //设置每行每列的值
            for (int i = 0; i < list.size(); i++) {
                // 创建一行，在页sheet上
                Row row1 = sheet.createRow(i+1);
                // 在row行上创建一个方格
                index = 0;
                for(int j=0;j<listMap.size();j++){
                	 // Row 行,Cell 方格 , Row 和 Cell 都是从0开始计数的
                	 if(StringUtil.isNull(listMap.get(j).get(title_key))){ 
	               		 continue;
	               	 }
                	String template =  (String) listMap.get(j).get(template_key);
                    Cell cell = row1.createCell(index);
                    Map<String, Object> map =(Map<String, Object>) list.get(i);
                    Object v = convert(map,map.get(listMap.get(j).get(col_key)), template);
                    cell.setCellValue(v == null?" ": v+"");
                    cell.setCellStyle(cs2);
                    index++;
                }
            }
            return wb;    		

    }
    
    protected Object convert(Map<String, Object> row,Object value,String template){
    	return value;
    }

}